node全栈开发(1)–koa2 链接 mysql 写api

简单尝试了 koa2 来操作数据 写api ,通过postMan测试通过。简单的把主要的几步流程整理出来了

  • 1.koa2如何链接sql
  • 2.koa2路由使用

结构目录

  • routers 路由
  • static 静态资源 // 现在暂时用不到
  • utils 封装工具函数
  • app.js 启动文件
  • default.js 配置文件

package.json

  • 先npm init 在package.json里填写以下koa的依赖,npm install 运行。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    {
    "name": "koa-demo",
    "version": "1.0.0",
    "description": "",
    "main": "index.js",
    "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
    },
    "keywords": [],
    "author": "",
    "license": "ISC",
    "dependencies": {
    "koa": "^2.13.1"
    },
    "devDependencies": {
    "chai": "^4.2.0",
    "ejs": "^3.1.5",
    "koa": "^2.13.1",
    "koa-bodyparser": "^4.3.0",
    "koa-mysql-session": "^0.0.2",
    "koa-router": "^10.0.0",
    "koa-session-minimal": "^4.0.0",
    "koa-static": "^5.0.0",
    "koa-static-cache": "^5.1.4",
    "koa-views": "^7.0.0",
    "markdown-it": "^12.0.4",
    "md5": "^2.3.0",
    "mocha": "^8.2.1",
    "moment": "^2.29.1",
    "mysql": "^2.18.1",
    "koa-cors": "0.0.16",
    "koa-jwt": "^3.5.1"
    }
    }

app.js

  • 新建启动入口文件app.js代码如下
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    //启动文件(入口文件)
    const Koa = require('koa')
    const bodyParser = require('koa-bodyparser') //上下文解析
    const static = require('koa-static') //静态资源服务
    const path = require('path')
    const cors = require('koa-cors') //跨域访问组件
    const registerRouter = require('./routers/index')
    const app = new Koa()
    // 配置静态资源文件
    const staticPath = './static'
    app.use(static(
    path.join( __dirname, staticPath)
    ))
    app.use(cors()) // 允许跨域访问
    app.use(bodyParser()) // body解析
    app.use(registerRouter())
    app.listen(3000,() =>{
    console.log("服务器已启动,http://localhost:3000");
    })

mysql 链接

  • default.js 来配置mysql的链接参数配置

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    const config = {
    // 启动端口
    port: 3000,

    // 数据库配置
    database: {
    host:'localhost',
    port:'3306',
    user:'root',
    password:'123456',
    database:'myshop'
    }
    }

    module.exports = config
  • utils目录下新建query.js

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    const config = require('../default').database
    const mysql = require('mysql')
    const pool = mysql.createPool(config)
    const query = function(sql,succCb,errCb){
    pool.getConnection(function(err,conn){
    if (err) {
    let data = {
    code:500,
    message:"请求失败",
    data:err
    };
    errCb(data);
    }else {
    conn.query(sql,function(err,result){
    if (err) {
    let data = {
    code:500,
    message:"请求失败",
    data:err
    };
    errCb(data);
    }else {
    succCb(result);
    conn.release();
    }
    })
    }
    })
    }
    module.exports = query;

路由

  • user.js 登录请求
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    const router = require('koa-router')();   //路由
    const query = require('../utils/query');
    const jwt = require('jsonwebtoken');
    const tbName = 'user';
    const preUrl = '/api/users';
    function signIn(userName,pwd){
    return new Promise((resolve,reject)=>{
    query(`select * from ${tbName} where username='${userName}' and userpwd=${pwd}`,function(res){
    if (res.length==0) {
    resolve({
    code:200,
    message:'用户名密码错误'
    })
    }else {
    const token = jwt.sign({id:res[0].userid}, 'token', {expiresIn: '15d'})
    resolve({
    code:200,
    message:'登录成功',
    data:{
    user:res[0],
    token:token
    }
    })
    }
    },function(err){
    resolve({
    code:200,
    message:'登录失败',
    data:err
    })
    })
    })
    }
    router
    .post(`${preUrl}/signIn`,async(ctx,next) =>{ //登录
    let data = await signIn(ctx.request.body.userName,ctx.request.body.password);
    ctx.body = data;
    })
    module.exports = router

-routers/index.js
当我们路由文件很多,不可能一个一个import,多累啊,万一漏了那个呢?麻烦。
所以还是利用glob和koa-compose来聚合一下我们routers文件夹下面的的所有路由文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// routers/index.js
const compose = require('koa-compose')
const glob = require('glob')
const { resolve } = require('path')

registerRouter = () => {
let routers = [];
glob.sync(resolve(__dirname, './', '**/*.js'))
.filter(value => (value.indexOf('index.js') === -1))
.map(router => {
routers.push(require(router).routes())
routers.push(require(router).allowedMethods())
})
return compose(routers)
}

module.exports = registerRouter

最后在主启动文件app.js

const registerRouter = require(‘./routers/index’);

app.use(registerRouter());

即可将全部的路由注册。

mysql 数据库

创建了 myshop 数据库,然后新建user数据表

数据库

运行node app.js postMan测试结果如下

数据库
数据库

demo代码已经上传git,git地址 https://gitee.com/smarterlo/koa-demo.git